home *** CD-ROM | disk | FTP | other *** search
- #include <sys/param.h>
- #include <sys/stat.h>
- #include <stdio.h>
- #include <string.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <errno.h>
- #include "crtlocal.h"
- #include <Aliases.h>
- #include <Resources.h>
-
- int unlink(const char *name)
- {
- long filenum;
- int i;
- OSErr err;
- HParamBlockRec pb;
- FSSpec name1 = hfs_canon(crt_parID, name, 0);
- if (!*name1.name) return -1;
- pb.fileParam.ioNamePtr = name1.name;
- pb.fileParam.ioVRefNum = name1.vRefNum;
- pb.fileParam.ioDirID = name1.parID;
- err = PBHDeleteSync(&pb);
- if (err) errno = errtran(err);
- return err?-1:0;
- }
-
- int symlink(const char *old, const char *new)
- {
- int err;
- FInfo info;
- AliasHandle alias;
- FSSpec name1 = hfs_canon(crt_parID, new, 0);
- FSSpec oldspec = hfs_canon(name1.parID, old, 1);
- if (!*name1.name) return -1;
- if (!*oldspec.name) return -1;
- err = errtran(FSpGetFInfo(&oldspec, &info));
- if (err)
- FSpCreateResFile(&oldspec,'R*ch','TEXT',0);
- err = errtran(NewAlias(0,&oldspec,&alias));
- if (!err)
- {
- OSErr err;
- int fd,refnum;
- FSpCreateResFile(&name1,info.fdCreator,info.fdType,0);
- err = errtran(ResError());
- if (!err)
- {
- short fRefNum;
- err = errtran(FSpGetFInfo(&name1, &info));
- if (err) return -1;
- info.fdFlags |= 0x8000;
- err = errtran(FSpSetFInfo(&name1, &info));
- if (err) return -1;
- fRefNum = FSpOpenResFile(&name1,fsRdWrPerm);
- if ( fRefNum != -1 )
- {
- AddResource((Handle)alias,'alis',0,name1.name);
- CloseResFile(fRefNum);
- }
- else err = errtran(ResError());
- }
- }
- return err?-1:0;
- }
-
- int readlink(const char *old, char *new, int len)
- {
- int err;
- long tmp;
- char str[MAXPATHLEN];
- Boolean targetIsFolder,wasAliased;
- FSSpec canon = hfs_canon(crt_parID, old, 0);
- if (!*canon.name) return -1;
- err = errtran(ResolveAliasFile(&canon,true,&targetIsFolder,&wasAliased));
- if (err) return -1;
- if (!wasAliased)
- {
- errno = ENOENT;
- return -1;
- }
- tmp = crt_parID;
- crt_parID = canon.parID;
- getwd(str);
- crt_parID = tmp;
- len = strlen(str);
- tmp = *canon.name;
- *canon.name = '/';
- strncpy(&str[len], (char *)canon.name, tmp+1);
- len += tmp+1;
- str[len] = 0;
- strncpy(new, str, len);
- return len;
- }
-